XML

СОДЕРЖАНИЕ | АВТОР | ИСТОЧНИКИ | СЛОВАРЬ | АННОТАЦИЯ

 

Сценарии

Сценарии могут использоваться в документах XSL точно также, как и в HTML. Кроме того, сценарии, содержащиеся внутри XSL-документа и запускаемые броузером в процессе обработки документа могут динамически создавать HTML-документы, извлекая необходимую для этого информацию непосредственно из элементов XSL-документа.

Для написания сценариев XSL использует специальный скриптовый язык - ECMAScript. Однако в msxsl для этих целей можно применять Microsoft JavaScript,- язык, который объединил в себе некоторые элементы стандартного JavaScript и ECMAScript.

Вычисление выражений

Наиболее простым примером использования сценариев в XSL -документе является вычисление значений параметров описываемых элементов. Для этого надо просто поставить знак равенства в качестве первого символа параметра, что заставит XSL-процессор вычислить значение выражения(синтаксис этого выражения должен отвечать требованиям JavaScript). Например, после разбора этого правила:

<rule>
<target-element type="header">
<hr width="=100-20+'%'">
<children/>
<hr width="80%">
</rule>

, в выходном документе окажутся следующие инструкции:

<hr width=80%>
...
<hr width=80%>

Очень часто в правилах XSL необходимо использовать атрибуты описываемого в них элемента. Для этого мы должны воспользоваться методом getAttribute(), описанным в объектной модели XML (мы рассматриваем объектную модель XML-документов, предложенную Microsoft, список этих функций приведен в конце раздела). Т.к. каждому элементу XSL доступен указатель на соответствующий ему объект, сценарий может обращаться к внутренним функциям и свойствам этих элементов, при помощи которых и осуществляются необходимые действия.

В следующем фрагменте XML- документа определяется элемент <article>, в котором атрибут src используется для задания адреса файла, содержащего текст статьи.

<articles>
<article src="http://server/pages/article.html">Bugs report</article>
</articles>

Для того, чтобы использовать этот атрибут в выходном HTML-документе, необходимо определить следующее правило:

<rule>
<target-element type="article">
<a href='=getAttribute("src")'>
<children/>
</a>
</rule>

После обработки этого фрагмента в выходной документ будет помещен элемент:

<a href="http://server/pages/article.html">Bugs report</a>

Выполнение инструкций

Другим способом помещения в выходной HTML- документ информации, являющейся результатом выполнения каких-либо операций JavaScript – сценариев является использовнаие инструкции <eval>;:

<rule>
<element type="articles">
<target-element type="article">
</element>
<tr><td><eval>childNumber(this)</eval></td><td>
<children/>
</td><tr>
</rule>

Метод childNumber в данном случае возвращает текущий номер дочернего элемента.

Определение функций и глобальных переменных

Аналогично тэгу <SCRIPT> в HTML, элемент <define-script> содержит функции и определения глобальных переменных. Обычно в XSL-документе определяется один элемент <define-script>, расположенный в самом начале.

<xsl>
<define-script>
<![CDATA[
var fontSize=12;
function getColor(elem){
return elem.children.item("color",0).text; 
		// Возвращает содержимое дочернего элемента <color>
}]]>
</define-script>
<rule>
<target-element type = "flower">
<div background-color="=getColor(this)"; font-size="=fontSize">
<children/>
</div>
</rule>
</xsl>

Если применить эти правила к такому фрагменту XML- документу:

<xml>
<flower>
rose
<color>red</color> 
</flower>

, то на выходе HTML -документ будет содержать следующие элементы:

<div background-color="red"; font-size="12">

Необходимо отметить, что использование глобальных переменных в некоторых случаях может приводить к серьезным ошибкам, вызванным попытками одновременного к ним доступа. Поэтому рекомендуется использовать такие переменные только в качестве констант.

Использование Java Script для HTML

Создавая шаблон HTML-документа, Вы можете указывать в нем практически любые элементы HTML, в том числе и блоки <SCRIPT>, внутри которых можно задавать любые конструкции Java Script, используя для этого область CDATA:

<xsl>
  <rule>
    <root/>
    <HTML>
      <HEAD>
        <SCRIPT LANGUAGE="JSCRIPT"><![CDATA[
var ie4=((navigator.appName=="Microsoft Internet Explorer")&&(parseInt(navigator.appVersion)  >= 4 ));
       function msover(){
if (ie4){
  		event.srcElement.style.color="red";
  		event.srcElement.style.cursor = "hand";
  	}
}
       function msout(){
	if (ie4){
  		event.srcElement.style.color="black";
  		event.srcElement.style.cursor = "auto";
  	}
}        ]]></SCRIPT>
      </HEAD>
      <BODY>
        <children/>
      </BODY>
    </HTML>
  </rule>
  <rule>
    <target-element type="chapter"/>
    <DIV id='=tagName + formatNumber(childNumber(this),"1")'
         background-color="marron"
    onmouseover='="msover("+ tagName + formatNumber(childNumber(this),"1")+")"'
    onmouseout='="msout("+ tagName + formatNumber(childNumber(this),"1")+")"'
      <children/>
    </DIV>
  </rule>
</xsl>

Если использовать эти правила для следующего XML- документа:

<contents>
  <chapter>Part1</chapter>
  <chapter>Part2</chapter>
  <chapter>Part3</chapter>
</contents>

то в результате мы получим такой HTML-файл:

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JSCRIPT">
var ie4=((navigator.appName=="Microsoft Internet Explorer")&&(parseInt(navigator.appVersion)  >= 4 ));
function msover(){
if (ie4){
  		event.srcElement.style.color="red";
  		event.srcElement.style.cursor = "hand";
 	}
}
function msout(){
	if (ie4){
  		event.srcElement.style.color="black";
  		event.srcElement.style.cursor = "auto";
  	}
  }
</SCRIPT>
</HEAD>
<BODY>
<DIV id=''chapter1"    onmouseover="msover("chapter1")"'
			  onmouseout="msout("chapter1")"'
      Part 1
       </DIV>
<DIV id=''chapter2"    onmouseover="msover("chapter2")"'
			  onmouseout="msout("chapter2")"'
      Part 2
       </DIV>
<DIV id=''chapter3"    onmouseover="msover("chapter3")"'
			  onmouseout="msout("chapter3")"'
      Part 3
       </DIV>
</BODY>
</HTML>

Встроенные функции XSL

В завершении приведем список внутренних функций, которые можно использовать в JavaScript –сценариях, предназначенных для анализатора msxsl:

Ancestor(elementType, elem) Возвращает для текущего элемента ссылку на ближайший родительский элемент заданного типа. Если такого элемента нет или текущий элемент пустой, то возвращает null
ChildNumber(elem) Возвращает индекс текущего элемента в списке других дочерних элементов данного типа.
AncestorChildNumber() Возвращает номер ближайшего предка текущего элемента или null, если такового не существует
path(xsl) Возвращает массив, содержащий "путь" к текущему элементу - в каждую ячейку этого массива помещается цифровое значение, указывающее на количество элементов одинакового типа, находящихся на текущем уровне вложенности. Первым значением этого массива будет представлен корневой элемент, последним - текущий. Размер массива определяет глубину вложенности текущего элемента.
HierarchicalNumberRecursive(elementType,elem) Метод, похожий на метод path, но возвращает только дочерние элементы
FormatNumber(n,format) Возвращает строку - символьное представление номера(т.е. "один", "два" и т.д.). Возможно определение следующих форматов:
"1" - 0,1,2,..
"01" - 01,02,03,...
"a" - a,b,c,..z, aa, ab,..zz
"A" - A,..,Z,AA, .. ZZ
FormatNumberList(list,format,separator) Возвращает строку, представляющую список, элементами которого являются символьные представления чисел


назад
содержание
вперед

 
Hosted by uCoz